home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_10 / mashlan / cptest.cpp < prev    next >
C/C++ Source or Header  |  1995-04-17  |  4KB  |  185 lines

  1. // cptest.cpp listing 3
  2. // copyright 1995 Robert Mashlan
  3. // demonstrations of the CheckedPtr, CheckedClassPtr
  4. // and HeapPtr class templates.
  5.  
  6. #include <iostream.h>
  7.  
  8. // remove the following if the C++ implements
  9. // a built-in bool type
  10.  
  11. typedef int bool;
  12. enum { false, true };
  13.  
  14. #include "checkptr.h"
  15. #include "heapptr.h"
  16.  
  17.  
  18. #define DO(exp) cout << #exp << ";" << endl; exp
  19.  
  20. void f1()
  21. {
  22.    cout << "f1()" << endl;
  23.    DO( char buf[] = "test" );
  24.    DO( CheckedPtr<char> p(buf,sizeof(buf)) );
  25.    DO( *p = 1 );
  26.    DO( *p = 'r'); // ok
  27.    DO( p = 0 );   // now a null pointer
  28.    DO( *p = 'r'); // error - dereferenced null pointer
  29. }
  30.  
  31. void f2()
  32. {
  33.    cout << "f2()" << endl;
  34.    DO( HeapPtr<char> a );
  35.    DO( const CheckedPtr<char> p(a(100),100) ); // allocate an array of 100 char
  36.    DO( for(int i=0;i<100;i++) p[i] = 0 ); // OK
  37.    DO( p[i] = 0 ); // out of range
  38. }
  39.  
  40. void f3()
  41. {
  42.    cout << "f3()" << endl;
  43.    DO( HeapPtr<char> a(100));
  44.    DO( const CheckedPtr<char> pa(a,100) );
  45.    // technically OK, but fails range check for the expression &v[100]
  46.    DO( for(CheckedPtr<char> p=pa; p<&pa[100]; p++) *p=0 );
  47. }
  48.  
  49. void f4()
  50. {
  51.    cout << "f4()" << endl;
  52.    DO( HeapPtr<char> a );
  53.    DO( const CheckedPtr<char> pa(a(100),100) );  // array of 100 char
  54.    DO( for( CheckedPtr<char> p=pa;p<pa+100; p++) *p=0 ); // OK
  55.    DO( *p = 0 ); // error
  56. }
  57.  
  58. void f5()
  59. {
  60.    cout << "f5()" << endl;
  61.    DO(int i);
  62.    DO(CheckedPtr<int> vi = &i );
  63.    DO(*vi = 0);
  64.    DO(vi++); // OK
  65.    DO(vi++); // error
  66. }
  67.  
  68. void f6()
  69. {
  70.    cout << "f6()" << endl;
  71.    DO( int i );
  72.    DO( CheckedPtr<int> vi = &i );
  73.    DO( *vi = 0 );
  74.    DO( vi++ );     // OK
  75.    DO( *vi = 0 );  // error
  76. }
  77.  
  78. void f7()
  79. {
  80.    cout << "f7()" << endl;
  81.  
  82.    class A {
  83.       public:
  84.          A(int i=0) : i(i) {};
  85.          void f(int d) { i=d; }
  86.       private:
  87.          int i;
  88.    };
  89.  
  90.    DO( HeapPtr<A> hp; );
  91.    DO( CheckedClassPtr<A> pa(hp(10),10) );
  92.    DO( for( CheckedClassPtr<A> p = pa; p < pa+10; p++ ) pa->f(1) );
  93.    DO( for(int i=0;i<10;i++) (pa+i)->f(i) );  // OK
  94.    DO( p->f(1) );  // error
  95. }
  96.  
  97. void f8()
  98. {
  99.    cout << "f8()" << endl;
  100.    DO( HeapPtr<char> a );
  101.    DO( HeapPtr<char> b );
  102.    DO( const CheckedPtr<char>pa(a(100),100) );
  103.    DO( const CheckedPtr<char>pb(b(100),100) );
  104.    DO( CheckedPtr<char>p; );
  105.    DO( for(p=pa; p<pa+100; p++) );  // ok
  106.    DO( for(p=pb; p<pa+100; p++) );  // error
  107. }
  108.  
  109. void f9()
  110. {
  111.    cout << "f9()" << endl;
  112.    DO( int a[10] );
  113.    DO( CheckedPtr<int> cpa(a,10) );
  114.    DO( CheckedPtr<int> cpb(a+10,10,a) );
  115.    DO( int *b = cpb; );
  116.    DO( int i );
  117.    DO( for(i=0;i<10;i++) cpa[i] = i );
  118.  
  119.    DO( cout << (cpa==a) << endl );
  120.    DO( cout << (cpa==cpb) << endl );
  121.    DO( cout << (a==cpa) << endl );
  122.  
  123.    DO( cout << (cpa!=a) << endl );
  124.    DO( cout << (a!=cpa) << endl );
  125.    DO( cout << (cpa!=cpb) << endl );
  126.  
  127.    DO( cout << (cpa<a) << endl );
  128.    DO( cout << (a<cpa) << endl );
  129.    DO( cout << (cpa<cpb) << endl );
  130.  
  131.    DO( cout << (cpa<=a) << endl );
  132.    DO( cout << (a<=cpa) << endl );
  133.    DO( cout << (cpa<=cpb) << endl );
  134.  
  135.    DO( cout << (cpa>a) << endl );
  136.    DO( cout << (a>cpa) << endl );
  137.    DO( cout << (cpa>cpb) << endl );
  138.  
  139.    DO( cout << (cpa>=a) << endl );
  140.    DO( cout << (a>=cpa) << endl );
  141.    DO( cout << (cpa>=cpb) << endl );
  142.  
  143.    cout << endl;
  144.    DO( for(i=0; i<10; i++) cout << *(cpa+i) );
  145.    cout << endl;
  146.    DO( for(i=0; i<10; i++) cout << *(i+cpa) );
  147.    cout << endl;
  148.    DO( for(i=10; i>0; i--) cout << *(cpb-i) );
  149.    cout << endl;
  150.  
  151.  
  152.    DO( cout << (a-cpa)  << endl );
  153.    DO( cout << (cpa-a) << endl );
  154.    DO( cout << (cpb-cpa) << endl );
  155.    DO( cout << (cpa-b)  << endl );
  156.    DO( cout << (b-cpa) << endl );
  157.  
  158. }
  159.  
  160. void test( void (*f)() )
  161. // run a test function, and display the exception information
  162. {
  163.    cout << endl;
  164.    try {
  165.       f();
  166.    }
  167.    catch( xCheckedPtr x ) {
  168.       cout << "xCheckedPtr exception: " << x.why() << endl;
  169.    }
  170. }
  171.  
  172. int main(void)
  173. {
  174.    test(f1);
  175.    test(f2);
  176.    test(f3);
  177.    test(f4);
  178.    test(f5);
  179.    test(f6);
  180.    test(f7);
  181.    test(f8);
  182.    test(f9);
  183.    return 0;
  184. }
  185.